#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020-11-21 22:55
# @Author : youngchaolin

# 爬虫例子

# 在正则表达式中，"."的作用是匹配除"\n"以外的任何字符，也就是说，它是在一行中进行匹配。
# 这里的行是以"\n"进行区分的。如果不使用re.S参数，则只在每一行内进行匹配，如果一行没有，
# 就换下一行重新开始，不会跨行。而使用re.S参数以后，正则表达式会将这个字符串作为一个整体，
# 将"\n"当做一个普通的字符加入到这个字符串中，在整体中进行匹配。
#
# 示例如下：

# import re
# a = '''asdfhellopass
#     123
#     worldaf
#     '''
# pat1 = re.compile('hello(.*?)world')
# pat2 = re.compile('hello(.*?)world', re.S)
# b = pat1.findall(a)
# c = pat2.findall(a)
# print('b is ', b)
# print('c is ', c)

# 结果如下
# b is  []
# c is  ['pass\n    123\n    ']

# 匹配的正则
# <div class="item">.*?<div class="pic">.*?<em .*?>.*?</em>.*?<span class="title">.*?</span>.*?<span class="rating_num" .*?>.*?</span>.*?<span>.*?评价</span>

import requests
import re
import json

'<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>.*?)</em>.*?<span class="title">(?P<name>.*?)</span>.*?<span class="rating_num" .*?>(?P<score>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>'


def parse_text(text):
    # re.S 会将爬取到的html作为一个整体来匹配
    com_regex = re.compile(
        '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>.*?)</em>.*?<span class="title">(?P<name>.*?)</span>.*?<span class="rating_num" .*?>(?P<score>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>',
        re.S)
    ret = com_regex.finditer(text)
    # 生成器 字典
    for item in ret:
        yield {
            'id': item.group('id'),
            '名字': item.group('name'),
            '评分': item.group('score'),
            '评论数': item.group('comment_num')
        }


def main(count):
    # 有分页的网址
    url = f'https://movie.douban.com/top250?start={count}&filter='
    response_text = requests.get(url).text
    # 解析返回的内容，通过正则获取想要的内容
    print('在查询---')
    print(response_text)
    ret = parse_text(response_text)
    with open('top250', mode='a', encoding='utf-8') as f:
        for obj in ret:
            print(obj)
            data = json.dumps(obj, ensure_ascii=False)
            f.write(data + '\n')


import time
import random

if __name__ == '__main__':
    count = 0
    # 自动分页，查询1到10页的内容，对应的https://movie.douban.com/top250?start=25&filter=里，就是start从0到225
    # 睡眠随机时间后再发起请求

    # 测试正则表达式是否正确
    # with open('豆瓣电影.html', mode='r', encoding='utf-8') as f:
    #     content = f.read()
    #     print(content)
    #     ret=parse_text(content)
    #     for obj in ret:
    #         print(obj)

    for i in range(10):
        time.sleep(random.randint(1, 10))
        main(count)
        count += 25

